﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Colorful.Furniture.CommonDto;
using Colorful.Furniture.Extensions;
using Newtonsoft.Json;

namespace Colorful.Furniture.EnterpriseManagement;

/// <summary>
///  成员分页
/// </summary>
public class MemberPagedInputDto : PageInputDto
{
    /// <summary>
    ///  部门id
    /// </summary>
    public long? DepartId { get; set; }

    /// <summary>
    ///  成员姓名
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    ///  状态
    /// </summary>
    public int? Status { get; set; }

    /// <summary>
    ///  手机号
    /// </summary>
    public string Mobile { get; set; }

    /// <summary>
    ///  企业邮箱
    /// </summary>
    public string BizMail { get; set; }

}

/// <summary>
///  创建
/// </summary>
public class CreateMemberInputDto
{
    /// <summary>
    /// 成员UserID。对应管理端的帐号，企业内必须唯一。不区分大小写，长度为1~64个字节
    /// </summary>
    [Required(ErrorMessage = "请输入帐号")]
    public virtual string UserId { get; set; }

    /// <summary>
    ///  手机号码，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
    /// </summary>
    [Required(ErrorMessage = "请输入手机号码")]
    public string Mobile { get; set; }

    /// <summary>
    ///  成员头像的mediaid，通过素材管理接口上传图片获得的mediaid
    /// </summary>
    public string AvatarMediaId { get; set; }

    /// <summary>
    /// 启用/禁用成员。1表示启用成员，0表示禁用成员
    /// </summary>
    public int Enable { get; set; } = 1;

    /// <summary>
    ///  别名
    /// </summary>
    public string Alias { get; set; }

    /// <summary>
    ///  是否邀请
    /// </summary>
    public virtual bool ToInvite { get; set; }

    /// <summary>
    ///  管理员编码
    /// </summary>
    public Guid? ManagerId { get; set; }

    /// <summary>
    ///  成员名称；第三方不可获取，调用时返回userid以代替name；代开发自建应用需要管理员授权才返回；对于非第三方创建的成员，第三方通讯录应用也不可获取；未返回name的情况需要通过通讯录展示组件来展示名字
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 成员所属部门id列表，仅返回该应用有查看权限的部门id；成员授权模式下，固定返回根部门id，即固定为1。对授权了“组织架构信息”权限的第三方应用，返回成员所属的全部部门id
    /// </summary>
    public List<long> DepartmentList { get; set; }

    /// <summary>
    /// 成员所属部门id列表
    /// </summary>
    [JsonIgnore]
    public string Department => DepartmentList.GenericToString();

    /// <summary>
    ///  部门内的排序值，默认为0。数量必须和department一致，数值越大排序越前面。值范围是0, 2^32)。[成员授权模式下不返回该字段
    /// </summary>
    public long Sort { get; set; }

    /// <summary>
    ///  职务信息
    /// </summary>
    public string Position { get; set; }

    /// <summary>
    /// 性别。0表示未定义，1表示男性，2表示女性。第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段。注：不可获取指返回值0
    /// </summary>
    public int Gender { get; set; }

    /// <summary>
    ///  邮箱
    /// </summary>
    public string Email { get; set; }

    /// <summary>
    ///  企业邮箱
    /// </summary>
    [Required(ErrorMessage = "请输入企业邮箱")]
    public string BizMail { get; set; }

    /// <summary>
    ///  表示在所在的部门内是否为部门负责人,1表示为部门负责人，0表示非部门负责人
    /// </summary>
    public int IsLeaderInDept { get; set; }

    /// <summary>
    ///  直属上级UserID
    /// </summary>
    public List<string> DirectLeaderList { get; set; }

    /// <summary>
    ///  直属上级UserID
    /// </summary>
    [JsonIgnore]
    public string DirectLeader => DirectLeaderList.GenericToString();

    /// <summary>
    ///  座机。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
    /// </summary>
    public string Telephone { get; set; }

    /// <summary>
    ///  地址。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
    /// </summary>
    public string Address { get; set; }
}

/// <summary>
///  更新
/// </summary>
public class UpdateMemberInputDto : CreateMemberInputDto
{
    /// <summary>
    ///  成员id
    /// </summary>
    public Guid Id { get; set; }

    /// <summary>
    ///  是否邀请
    /// </summary>
    [JsonIgnore]
    public override bool ToInvite { get; set; }
}

/// <summary>
///  设置标签
/// </summary>
public class SetLabelInputDto
{
    /// <summary>
    ///  标签id
    /// </summary>
    public int TagId { get; set; }

    /// <summary>
    ///  成员列表
    /// </summary>
    public string[] UserList { get; set; }
}